<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>内存泄漏-溢出</title>
  </head>
  <body>
    <script>
      /**
       * 1.内存溢出：
       *   - 是一种程序运行出现的错误
       *   - 当程序运行需要的内存超过了剩余内存时，就会出现内存溢出
       *
       * 2.内存泄漏：占用的内存没有被及时释放
       *   - 内存泄漏积累多了就容易导致内存溢出
       * 3.常见的内存泄漏：
       *   - 意外的全局变量
       *   - 没有及时清理的定时器或回调函数
       *   - 闭包
       *   - 超出Dom引用
       *
       * 4.javascript垃圾回收机制（标记清除算法）
       *   标记和扫描算法经过以下3个步骤：
       *     1. roots：通常，root是代码中引用的全局变量。例如，在JavaScript中，可以充当root的全局变量是“窗口”对象。Node.js中的相同对象称为“全局”。所有root的完整列表由垃圾收集器构建。
       *     2. 然后算法会检查所有root和他们的子对象并且标记它们是活动的（即它们不是垃圾）。任何root不能达到的，将被标记为垃圾。
       *     3. 最后，垃圾回收器释放所有未标记为活动的内存块，并将该内存返回给操作系统。
       *
       * 5.变量存储在栈中，对象存储在堆内存中；
       */
      //意外的全局变量
      function fn5() {
        a = new Array(100); //此时a成为全局变量，为了避免，使用var
        console.log(a);
      }
      fn5();

      //没有及时清理计时器
      var intervalId = setInterval(function() {
        console.log("清理计时器");
      }, 1000);
      clearInterval(intervalId);
    </script>
  </body>
</html>
